package com.atwy.linearstructure.stack;

import java.util.Scanner;

/**
 * @Author: 小王子火
 * @Date: 2020/11/29
 */
public class Array2StackDemo {
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(4);
        boolean loop = true;

        Scanner scanner = new Scanner(System.in);
        char key = ' ';

        while (loop) {
            System.out.println("s(showAll): 显示栈的数据信息");
            System.out.println("e(exit): 退出程序");
            System.out.println("a(push): 入栈");
            System.out.println("g(pop): 出栈");
            key = scanner.next().charAt(0);// 接收一个字符
            switch (key) {
                case 's':
                    stack.show();
                    break;
                case 'a':
                    System.out.println("请输入一个数字：");
                    int value = scanner.nextInt();
                    stack.push(value);
                    break;
                case 'g':
                    try {
                        int res = stack.pop();
                        System.out.printf("出栈的数据是%d\n",res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                default:
                    break;
            }

        }

        System.out.println("程序已终止~");
    }
}

/**
 * 用数组实现栈。
 * 1、栈是一个先进后出（FILO）的有序列表。
 * 2、栈是限制线性表中元素的插入和删除只能在 线性表的同一端进行的一种特殊线性表。
 *   其中允许插入和删除的一端为变化端，称为栈顶。
 *   另外一端是固定端，称为栈底。
 */
class ArrayStack {
    /**
     * 栈的大小
     */
    private int maxSize;
    /**
     * 数组模拟栈，数据存放的地方
     */
    private int[] stack;
    /**
     * top表示栈顶，初始化为-1
     */
    private int top = -1;

    /**
     * 构造器
     */
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[this.maxSize];
    }

    /**
     * 判断栈是否已满，如果栈中元素个数为0，即maxSize=0，此时栈既是满的也是空的
     */
    public boolean isFull() {
        return top == maxSize - 1;
    }

    /**
     * 判断栈是否为空
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 入栈操作，入栈前要检验栈是否已满
     */
    public void push(int value) {
        if (isFull()) {
            System.out.println("栈已满，不能添加数据");
            return;
        }
        top++;
        stack[top] = value;
    }

    /**
     * 出栈，出栈前要判断栈是否为空
     */
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空，无数据可取~");
        }
        int value = stack[top];
        top--;
        return value;
    }

    /**
     * 打印栈的数据，从栈顶到栈底的顺序
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("栈空，无数据可显示~");
            return;
        }
        for (int i = top; i >= 0; i--) {
            System.out.printf("stack[%d]=%d\n", i, stack[i]);
        }
    }

}
